public class MyCircularQueue {
    public int[] elem;     // 存储队列元素的数组
    public int front;      // 指向队列头部元素的下标
    public int rear;       // 指向下一个插入位置的索引
    public boolean flg;    // 标志位，用于区分队列空和满的状态（默认值为 false）
    /*flg = false：队列可能为空。
      flg = true：队列非空且可能已满。*/

    public MyCircularQueue(int k) {
        elem = new int[k];  // 初始化数组，大小为 k
        // 默认初始化规则：front 和 rear 默认初始化为 0，flg 默认初始化为 false表示空队列。
    }

    // 入队操作 enQueue
    public boolean enQueue(int value) {
        if (isFull()) {         // 队列已满，直接返回失败
            return false;
        }
        elem[rear] = value;         // 将值插入当前 rear 位置
        rear = (rear + 1) % elem.length;  // rear 后移（循环）
        flg = true; // 入队后队列非空，每次成功入队后都会将 flg 设为 true
        return true;
    }

    // 出队操作 deQueue
    public boolean deQueue() {
        if (isEmpty()) {        // 队列为空，直接返回失败
            return false;
        }
        front = (front + 1) % elem.length;  // front 后移（循环）
        flg = false; // 每次出队后将 flg 设为 false，因为出队后队列可能变为空
        return true;
    }

    // 获取队头元素 Front
    public int Front() {
        if (isEmpty()) {        // 队列为空，返回 -1
            return -1;
        }
        return elem[front];     // 返回 front 指向的元素
    }

    // 获取队尾元素 Rear
    public int Rear() {
        if (isEmpty()) {        // 队列为空，返回 -1
            return -1;
        }
        int index = (rear == 0) ? elem.length - 1 : rear - 1;  // 计算队尾索引
        return elem[index];
    }

    // 判空 isEmpty
    public boolean isEmpty() {
        return (front == rear && !flg);  // front == rear 且 flg = false 时为空
    }

    // 判满 isFull
    public boolean isFull() {
        return (front == rear && flg);  // front == rear 且 flg = true 时为满
    }
}
